//泛型的上界
//class TestGenric<T extends Number>{
////T一定是Number或者Number的子类
//}
//class Person{
//
//}
//class Student extends Person{
//
//}
//class TestGeneric2<T extends Person>{
//
//}
//
//
//public class test2 {
//    public static void main(String[] args){
//        TestGenric<Number> testGenric=new TestGenric<>();
//        TestGenric<Integer> testGenric1=new TestGenric<>();
//        TestGenric<Double> testGenric11=new TestGenric<>();
//       // TestGenric<String> testGenric111=new TestGenric<>();//Number的子类中不包括String  所以会报错
//        TestGeneric2<Person> personTestGeneric2=new TestGeneric2<>();
//        TestGeneric2<Student> studentTestGeneric2=new TestGeneric2<>();
//
//    }
//
//}

//要求：写一个泛型类，求数组中的最大值
//abstract class MyArray1<T>implements Comparable{
////    当 implements Comparable 写在类名后面的尖括号 > 外面时，比如 class MyArray<T> implements Comparable ，
////    表示这个类 MyArray 实现了 Comparable 接口。
////    这意味着这个类的对象可以和其他对象进行比较，并且需要重写 Comparable 接口中的 compareTo 方法来定义比较规则。
// //正确的泛型类型参数约束应该是像 class MyArray<T extends Comparable<T>> 这样，
//// 表示类型参数 T 必须是 Comparable 的子类或者实现了 SomeClass 接口
//    @Override
//    public int compareTo(Object o) {
//        return 0;
//    }
//
//    public T Maxvalue(T[] array){
//        T max=array[0];
//        for(int i=0;i<array.length;i++){
//            if(max<array[i])//注意：引用数据类型的比较方法！比如：引用数据类型Person比较大小时不能单纯用等号，是年龄比较还是学号比较？
//                max=array[i];
//        }
//        return max;
//    }
//}//自己的错误写法



//要求：写一个泛型类，求数组中的最大值
//分析：1、T为引用数据类型,不能简单的用==来比较大小
// 2、T本质为Object，而Object类没有实现compareable接口，无法比较大小
//class MyArray<T extends Comparable<T>>{//直接写T extends Comparable是一种不完整的接口引用。
//    // class MyArray<T extends Comparable<T>> 这样，
//    // 表示类型参数 T 必须是 SomeClass 的子类或者实现了 Comparable<T> 接口
//    //此处主要用到T实现了 Comparable<T>接口的功能
//    //Comparable<T> 是 Java 中的一个泛型接口，实现了这个接口的类的对象可以进行自然排序。该接口只有一个抽象方法 int compareTo(T o)
//    public T Maxvalue(T[] array){
//        T max=array[0];
//        for(int i=0;i<array.length;i++){
//            if(max.compareTo(array[i])<0)//注意：引用数据类型的比较方法！比如：引用数据类型Person比较大小时不能单纯用等号，是年龄比较还是学号比较？
//                max=array[i];//max比array小，为<0
//        }
//        return max;
//     }
//}
//public class test2 {
//    public static void main(String[] args) {
//        MyArray<Integer> myArray=new MyArray<>();
//        Integer []a=new Integer[3];
//        //一次写多个：Integer[] a={1,123,1};
//        a[0]=1;
//        a[1]=123;
//        a[2]=1;
//        System.out.println(myArray.Maxvalue(a));
//    }
//}

//上述代码为泛型类，问泛型方法怎么写？
class MyArray2{
    public<T extends Comparable<T>> T Maxvalue(T[] array){
        T max=array[0];
        for(int i=0;i<array.length;i++){
            if(max.compareTo(array[i])<0)//注意：引用数据类型的比较方法！比如：引用数据类型Person比较大小时不能单纯用等号，是年龄比较还是学号比较？
                max=array[i];//max比array小，为<0
        }
        return max;
    }
}

public class test2 {
    public static void main(String[] args) {
        MyArray2 myArray=new MyArray2();//不用写为MyArray<Integer> myArray=new MyArray<>();不用传类型。
        Integer[] a={1,123,1};//会自动根据输入值识别类型
        System.out.println(myArray.Maxvalue(a));
    }
}























